"""
日志模块，用于记录系统日志
"""
import os
import sys
import logging
import configparser
from logging.handlers import RotatingFileHandler
from typing import Optional


class Logger:
    """日志类，用于记录系统日志"""
    
    def __init__(self):
        """初始化日志类"""
        # 创建日志器
        self.logger = logging.getLogger("WeChatAlarm")
        
        # 设置默认日志级别
        self.setLevel("INFO")
        
        # 日志文件路径
        self.log_file = "logs/wechat_alarm.log"
        
        # 创建处理器
        self._setup_handlers()
    
    def _setup_handlers(self):
        """设置日志处理器"""
        # 清理已有处理器
        for handler in self.logger.handlers[:]:
            self.logger.removeHandler(handler)
        
        # 创建控制台处理器
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(logging.Formatter("%(asctime)s [%(name)s] [%(levelname)s] [%(filename)s:%(lineno)d]  %(message)s", "%Y-%m-%d %H:%M:%S"))
        self.logger.addHandler(console_handler)
        
        # 确定应用程序根目录
        if getattr(sys, 'frozen', False):
            # 如果是打包后的可执行文件
            app_root = os.path.dirname(sys.executable)
        else:
            # 如果是开发环境
            app_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
        
        # 尝试从配置文件读取日志文件路径
        try:
            config = configparser.ConfigParser()
            
            # 优先使用可执行文件所在目录下的配置文件
            if getattr(sys, 'frozen', False):
                # 如果是打包后的可执行文件
                base_dir = os.path.dirname(sys.executable)
                config_path = os.path.join(base_dir, "config", "config.ini")
            else:
                # 如果是开发环境
                config_path = os.path.join(app_root, "config", "config.ini")
                
            print(f"尝试读取配置文件: {config_path}")
            if os.path.exists(config_path):
                config.read(config_path, encoding="utf-8")
                if config.has_section("system") and config.has_option("system", "log_file"):
                    self.log_file = config.get("system", "log_file")
                
                # 读取日志级别
                if config.has_section("system") and config.has_option("system", "log_level"):
                    self.setLevel(config.get("system", "log_level"))
        except Exception as e:
            print(f"读取配置文件异常: {e}")
        
        # 确保日志路径是绝对路径
        if not os.path.isabs(self.log_file):
            # 根据是否是打包环境，选择不同的基础路径
            if getattr(sys, 'frozen', False):
                # 如果是打包后的可执行文件，使用可执行文件所在目录
                base_dir = os.path.dirname(sys.executable)
                self.log_file = os.path.join(base_dir, self.log_file)
            else:
                # 如果是开发环境，使用项目根目录
                self.log_file = os.path.join(app_root, self.log_file)
        
        # 确保日志目录存在
        log_dir = os.path.dirname(self.log_file)
        if not os.path.exists(log_dir):
            os.makedirs(log_dir, exist_ok=True)
        
        # 记录日志文件路径
        print(f"日志文件路径: {self.log_file}")
        
        # 创建文件处理器
        file_handler = RotatingFileHandler(self.log_file, maxBytes=10*1024*1024, backupCount=5, encoding="utf-8")
        file_handler.setFormatter(logging.Formatter("[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S"))
        self.logger.addHandler(file_handler)
    
    def setLevel(self, level: str):
        """
        设置日志级别
        
        Args:
            level: 日志级别，可选值：DEBUG, INFO, WARNING, ERROR, CRITICAL
        """
        # 转换日志级别
        level_dict = {
            "DEBUG": logging.DEBUG,
            "INFO": logging.INFO,
            "WARNING": logging.WARNING,
            "ERROR": logging.ERROR,
            "CRITICAL": logging.CRITICAL
        }
        
        # 设置日志级别
        level_value = level_dict.get(level, logging.INFO)
        self.logger.setLevel(level_value)
        
        # 同时更新所有处理器的日志级别
        for handler in self.logger.handlers:
            handler.setLevel(level_value)
    
    def debug(self, msg: str, *args, **kwargs):
        """记录调试日志"""
        self.logger.debug(msg, *args, **kwargs)
    
    def info(self, msg: str, *args, **kwargs):
        """记录信息日志"""
        self.logger.info(msg, *args, **kwargs)
    
    def warning(self, msg: str, *args, **kwargs):
        """记录警告日志"""
        self.logger.warning(msg, *args, **kwargs)
    
    def error(self, msg: str, *args, **kwargs):
        """记录错误日志"""
        self.logger.error(msg, *args, **kwargs)
    
    def critical(self, msg: str, *args, **kwargs):
        """记录严重错误日志"""
        self.logger.critical(msg, *args, **kwargs)


# 单例实例
logger = Logger() 